package zr.dao;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import zr.Main;

public enum Operation {
	定色, 翻子, 走子, 吃子, 并子, 胜;

	/**
	 * 判断可否进行qz1吃掉qz2的操作
	 * 
	 * @param qz1
	 * @param qz2
	 * @return
	 */
	public static boolean canEat(QiZi qz1, QiZi qz2) {
		if (qz1.color.equals(qz2.color) == false && qz2.isFankai()) {// 首先得保证双方颜色不同并且棋子2是翻开的
			if (qz2.isInSafeHouse() == false) {// 棋子2不在行营中
				if (qz1.isMoveable() && qz1.isBomb() == false) {// 棋子1首先得是一个可移动的棋子，即不能是地雷、军棋；当然也不能是炸弹
					if (qz2.isBomb() == false) {// 棋子2也不能是炸弹
						if (in(qz2.point, oneStepArea(qz1))) {// 如果qz2所处点属于qz1的“一步可达点”的话
							if (qz2.isMine()) {// 如果棋子2是地雷的话
								if (qz1.name.equals(QiZiName.工兵))
									return true;
							} else if (qz2.isFlag()) {// 如果棋子2是军旗的话
								if (QiZi.isAnyMineLeft(qz2.color) == false){// 则要看棋子2这边的地雷是否还有剩余
									Main.write(Operation.胜+":"+Main.me+" 胜！");
									Thread t=new Thread(){
										public void run(){
											JOptionPane.showMessageDialog(Main.frame, "你赢了！");											
										}
									};
									t.start();
									return true;
								}
							} else {
								if (qz1.name.ordinal() > qz2.name.ordinal())
									return true;
							}
						}
					}
				}
			}
		}
		return false;
	}

	/**
	 * 判断可否进行qz1并掉qz2的操作(这个并掉包括“对掉”和“炸掉”以及“主动被炸掉”)
	 * 
	 * @param qz1
	 * @param qz2
	 * @return
	 */
	public static boolean canBing(QiZi qz1, QiZi qz2) {
		if (qz1.color.equals(qz2.color) == false && qz2.isFankai()) {// 首先得保证双方颜色不同并且棋子2是翻开的
			if (qz2.isInSafeHouse() == false) {// 棋子2不在行营中
				if (qz1.isMoveable()) {// 棋子1首先得是一个可移动的棋子，即不能是地雷、军棋
					if (in(qz2.point, oneStepArea(qz1))) {// 如果qz2所处点属于qz1的“一步可达点”的话
						if (qz1.isBomb()) {// 如果棋子1是炸弹的话，“炸掉”
							if (qz2.isFlag() == false)// 那么只要棋子2不是军旗就可以
								return true;
						} else if (qz2.isBomb()) {// 如果棋子2是炸弹的话，“主动被炸掉”
							return true;
						} else {// 棋子1和棋子2都不是炸弹，只能是“对掉”的情况
							if (qz1.name.ordinal() == qz2.name.ordinal())
								return true;
						}

					}
				}
			}
		}

		return false;
	}

	static boolean in(Point point, List<Point> points) {
		for (Point p : points)
			if (p.x == point.x && p.y == point.y)
				return true;
		return false;
	}

	private static boolean inn(Point p, List<QiZi> all) {
		for (QiZi qz : all) {
			if (qz.point.x == p.x && qz.point.y == p.y)
				return true;
		}
		return false;
	}

	public static List<Point> oneStepArea(QiZi qz1) {
		int row, col, x = qz1.point.x, y = qz1.point.y;
		List<Point> list = new ArrayList<Point>();
		// 上
		if (x == 0 || (x == 6 && (y == 1 || y == 3)))
			;
		else if (x == 11 || x == 1 || x == 2
				|| (x >= 3 && x <= 5 && y >= 1 && y <= 3)
				|| (x >= 7 && x <= 10 && y >= 1 && y <= 3)
				|| (x == 6 && y == 2)) {
			// 这些都是只能往上走一步的，如果上方有棋子，那么就完了
			Point p = new Point(x - 1, y);
			// if(inn(p,Main.all)==false)//如果上方没有棋子
			list.add(p);
		} else {
			row = x - 1;
			while (row >= 1) {
				Point p = new Point(row, y);
				if (inn(p, Main.all) == false)// 此处无棋子
					list.add(p);
				else {
					list.add(p);
					break;
				}
				row--;
			}
		}
		// 下
		if (x == 11 || (x == 5 && (y == 1 || y == 3)))
			;
		else if (x == 0 || x == 10 || x == 9
				|| (x <= 8 && x >= 6 && y >= 1 && y <= 3)
				|| (x <= 4 && x >= 1 && y >= 1 && y <= 3) || (x == 5 && y == 2)) {
			// 这些都是只能往下走一步的，如果下方有棋子，那么就完了
			Point p = new Point(x + 1, y);
			// if(inn(p,Main.all)==false)//如果下方没有棋子
			list.add(p);
		} else {
			row = x + 1;
			while (row <= 10) {
				Point p = new Point(row, y);
				if (inn(p, Main.all) == false)// 此处无棋子
					list.add(p);
				else {
					list.add(p);
					break;
				}
				row++;
			}
		}
		// 左
		if (y == 0)
			;
		else if (y == 1
				|| ((y == 2 || y == 3 || y == 4) && (x != 1 && x != 5 && x != 6 && x != 10))) {
			// 这些都是只能往左走一步的，如果左方有棋子，那么就完了
			Point p = new Point(x, y - 1);
			// if(inn(p,Main.all)==false)//如果左方没有棋子
			list.add(p);
		} else {
			col = y - 1;
			while (col >= 0) {
				Point p = new Point(x, col);
				if (inn(p, Main.all) == false)// 此处无棋子
					list.add(p);
				else {
					list.add(p);
					break;
				}
				col--;
			}
		}
		// 右
		if (y == 4)
			;
		else if (y == 3
				|| ((y == 2 || y == 1 || y == 0) && (x != 1 && x != 5 && x != 6 && x != 10))) {
			// 这些都是只能往右走一步的，如果右方有棋子，那么就完了
			Point p = new Point(x, y + 1);
			// if(inn(p,Main.all)==false)//如果右方没有棋子
			list.add(p);
		} else {
			col = y + 1;
			while (col <= 4) {
				Point p = new Point(x, col);
				if (inn(p, Main.all) == false)// 此处无棋子
					list.add(p);
				else {
					list.add(p);
					break;
				}
				col++;
			}
		}
		if (qz1.isInSafeHouse()) {
			// 左上
			Point p = new Point(x - 1, y - 1);
			// if(inn(p,Main.all)==false)
			list.add(p);
			// 左下
			p = new Point(x + 1, y - 1);
			// if(inn(p,Main.all)==false)
			list.add(p);
			// 右上
			p = new Point(x - 1, y + 1);
			// if(inn(p,Main.all)==false)
			list.add(p);
			// 右下
			p = new Point(x + 1, y + 1);
			// if(inn(p,Main.all)==false)
			list.add(p);
		}
		if (x == 1 && y == 0 || x == 6 && y == 0)
			list.add(new Point(x + 1, y + 1));
		if (x == 5 && y == 0 || x == 10 && y == 0)
			list.add(new Point(x - 1, y + 1));
		if (x == 1 && y == 4 || x == 6 && y == 4)
			list.add(new Point(x + 1, y - 1));
		if (x == 5 && y == 4 || x == 10 && y == 4)
			list.add(new Point(x - 1, y - 1));
		if (x == 1 && y == 2 || x == 6 && y == 2) {
			list.add(new Point(x + 1, y - 1));
			list.add(new Point(x + 1, y + 1));
		}
		if (x == 3 && y == 0 || x == 8 && y == 0) {
			list.add(new Point(x - 1, y + 1));
			list.add(new Point(x + 1, y + 1));
		}
		if (x == 5 && y == 2 || x == 10 && y == 2) {
			list.add(new Point(x - 1, y - 1));
			list.add(new Point(x - 1, y + 1));
		}
		if (x == 3 && y == 4 || x == 8 && y == 4) {
			list.add(new Point(x - 1, y - 1));
			list.add(new Point(x + 1, y - 1));
		}
		return list;
	}

}
